
export interface Df2Serie {
  data: Array<number | { key: number; value: number }>; // 线的数据，一般等同categories的长度，空缺则线段不连接不绘
  type: string; // 一条线的标识名称，多条时确保不冲突
  style?: string; // 线的种类，可以取值dash虚线和smooth曲线，默认直接
  color?: string; // 线的颜色
  point?: { // 是否绘制圆点
    size: number; // 控制点半径
    stroke: string; // 点颜色
    lineWidth: number; // 点边线宽
  };
  key?: string;
  size?: number;
}

export interface Df2Axis {
  tickCount?: number;
  htAlign?: boolean;
  label?: string | ((text: string, index: number, total: number) => any);
}

export interface Df2Legend {
  position: string; // 'top' | 'bottom' | 'left' | 'right';
  offsetX?: number;
  offsetY?: number;
}

export interface Df2Tooltip {
  showTitle: boolean;
  showCrosshairs: boolean;
  offsetX?: number;
  offsetY?: number;
}

export type BaseChartProps = {
  categories: string[]; // x坐标列表，等同全部数据的宽度
  series: Df2Serie[]; // 线的数据，可以为多条线。如果只有一条线，整体也应该是个数组。
  xAxis: Df2Axis;
  yAxis: Df2Axis;
  legend: boolean | Df2Legend;
  tooltip: boolean | Df2Tooltip;
}

export type LineProps = { // 线图
  cn: 'line';
  categories: string[]; // x坐标列表，等同全部数据的宽度
  series: Array<{
    data: number[]; // 线的数据，一般等同categories的长度，空缺则线段不连接不绘
    type: string; // 一条线的标识名称，多条时确保不冲突
    style?: string; // 线的种类，可以取值dash虚线和smooth曲线，默认直接
    color?: string; // 线的颜色
    point?: { // 是否绘制圆点
      size: number; // 控制点半径
      stroke: string; // 点颜色
      lineWidth: number; // 点边线宽
    };
  }>; // 线的数据，可以为多条线。如果只有一条线，整体也应该是个数组。
  xAxis: Df2Axis;
  yAxis: Df2Axis;
  legend: boolean | Df2Legend;
  tooltip: boolean | Df2Tooltip;
  padding?: number | number[];
  appendPadding?: number | number[];
}

export type Df2Adjust = {
  type: string; // 层叠，取值stack时分组，取值dodge时多个区域在y方向上层叠
  marginRatio: number; // Number 分组间柱子的间距
}

export type AreaProps = { // 区域图
  cn: 'area';
  categories: string[]; // x坐标列表，等同全部数据的宽度
  series: Array<{
    data: number[]; // 线的数据，一般等同categories的长度，空缺则线段不连接不绘
    type: string; // 一条线的标识名称，多条时确保不冲突
    style?: string; // 线的种类，可以取值dash虚线和smooth曲线，默认直接
    color?: string; // 线的颜色
    point?: { // 是否绘制圆点
      size: number; // 控制点半径
      stroke: string; // 点颜色
      lineWidth: number; // 点边线宽
    };
  }>; // 线的数据，可以为多条线。如果只有一条线，整体也应该是个数组。
  xAxis: Df2Axis;
  yAxis: Df2Axis;
  legend: boolean | Df2Legend;
  tooltip: boolean | Df2Tooltip;
  adjust?: string | Df2Adjust;
}

export type D2fCoord = {
  transposed: boolean; // Boolean 是否转换，当为true时柱状图会横置x/y轴，变成条形图
}

export type ColumnProps = { // 柱状图
  cn: 'column';
  categories: string[]; // x坐标列表，等同全部数据的宽度
  series: { data: number[]; type?: string; color?: string }[]; // 线的数据，可以为多条线。如果只有一条线，整体也应该是个数组。
  xAxis: Df2Axis;
  yAxis: Df2Axis;
  legend: boolean | Df2Legend;
  tooltip?: boolean | Df2Tooltip;
  adjust?: string | Df2Adjust;
  coord?: D2fCoord;
}

export type BarProps = ColumnProps & {// 条形图
  cn: 'bar';
}

export type RadarProps = BaseChartProps & { // 雷达图
  cn: 'radar';
}

export type PieProps = {
  cn: 'pie';
  series: Array<{
    data: number;
    type: string;
    color?: string;
    key?: string;
  }>; // 线的数据，可以为多条线。如果只有一条线，整体也应该是个数组。
  radius: number; // 饼的缩放大小，默认1
  innerRadius?: number; // 饼的内环缩放大小，默认0。当大于0时饼图呈现环状
  legend: boolean | Df2Legend;
  tooltip?: boolean | Df2Tooltip;
  style?: {
    lineWidth: number; // int 线宽。
    stroke: string; // String 线色。
  };
  guide?: {
    line?: object;
    text?: {
      position: string[];
      content: string;
      style: {
        fontSize: number;
        fill: string;
      };
    };
  };
  cascade?: boolean;
  pieLabel?: boolean;
  activeShape?: boolean;
  sidePadding?: number;
}

export type RoseProps = { // 玫瑰图
  cn: 'rose';
  series: Df2Serie[];
  legend: boolean | Df2Legend;
  tooltip: boolean | Df2Tooltip;
}

export type ScatterProps = { // 散点图
  cn: 'scatter';
  series: Df2Serie[]; // 线的数据，可以为多条线。如果只有一条线，整体也应该是个数组。
  xAxis: Df2Axis;
  yAxis: Df2Axis;
  legend: boolean | Df2Legend;
  tooltip: boolean | Df2Tooltip;
  style: {
    fillOpacity: number;
  };
}

export type KLineProps = { // 散点图
  cn: 'kline';
  series: Array<{ time: string; start: number; end: number; max: number; min: number }>;
  xAxis: Df2Axis;
  yAxis: Df2Axis;
  guide: {
    line: object;
    text: object;
  };
}

export type TimeshareProps = {
  cn: 'timeshare';
  series: Array<{ time: string; price: number; volume: number }>;
  xAxis: Df2Axis;
  yAxis: Df2Axis;
  guide: {
    line: object;
    text: object;
  };
}

export type ChartProps = LineProps | AreaProps | ColumnProps | BarProps | RadarProps | PieProps | RoseProps | ScatterProps | KLineProps | TimeshareProps
